/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wx
 * Date: 2024-03-13
 * Time: 19:19
 */

/**
 *  *  TCP / IP 五层/四层 网络协议
 *  *  1.应用层
 *  *  程序拿到数据之后,要用来干啥,解决什么问题
 *  *
 *  *  2.传输层
 *  *  负责关注 网络数据包 起点 和 终点(从哪里来,到哪里去) 端到端 之间的传输
 *  *
 *  *  3.网络层
 *  *  负责关注,起点终点之间,要走那条路(路径规划)
 *  *
 *  *  4.数据链路层
 *  *  负责两个相邻节点之间的传输
 *  *
 *  *  5.物理层
 *  *  通信过程中的基础
 *
 *  对于一台主机,他的操作系统内核实现了从传输层到物理层,也即是TCP/IP五层模型的下四层
 *  对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层 (路由器工作在网络层)
 *  对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP模型的下两层 (交换机工作在数据链路层)
 *  对于集线器,它只实现物理层
 *  上述的这些,是理论上的实现方式(教科书上的)
 *  事实上,真实世界中的交换机/路由器更为复杂,功能更强大
 *  很多交换机,也具有一些路由器的功能,也能工作在网络层
 *  很多路由器,也具备一些交换机的功能,也能工作在数据链路层
 *
 *  封装 和 分用 网络数据传输过程中,最核心的流程
 *  举个例子
 *  A 通过 QQ 给 B 发送了一个hello
 *  1.应用层(应用程序) QQ
 *  QQ就会从消息输入框获取到用户输入的 hello
 *  就要把这个字符构造成一个应用层的数据包
 *  QQ这样的程序就设置了这样的应用层协议,应用层数据包就是按照这个应用层协议的格式来构造的(简单想象成字符串拼接)
 *  应用层协议,往往是实现这个程序的程序猿自己定义的
 *  此时假定这个应用层协议的格式:
 *  发送方的QQ号;接收方的QQ号;发送时间;消息正文
 *  1233;3321;2024-3-13 12:00;hello
 *  应用程序就会调用操作系统提供的api,把这个数据包交给传输层
 *
 *  2.传输层
 *  传输层就会把上述数据作为一个整体,在构造成一个传输层的数据包 传输层涉及到的协议,最主要的就是TCP/UDP
 *  此处假定是使用UDP来进行通信.就会构成UDP数据包
 *
 *  UDP报头|1233;3321;2024-3-13 12:00;hello
 *
 *  前边叫报头(header) 后边叫载荷(payload)
 *  型如上述,添加报头的过程,就叫做"封装"
 *  其实就是字符串拼接
 *  拼的报头,具有一定结构
 *  UPD报头,虽然不能起到保护数据,但是可以起到 "贴标签" 类似效果
 *  就能承载一些关键的用来转发数据的信息
 *  对于UDP报头来说,它承载的最重要的信息,就是源IP 源端口 和 目的IP 目的端口
 *  拼好传输层数据包之后,就要把这个数据包进一步到的交给下层,网络层继续进行封装了
 *  (交给下层,指的是,下层协议提供一组 api(函数),上层调用这个 api, 并且把刚才构建好的数据通过参数传过去,下层协议就可以来处理这个数据了)
 *
 *  3.网络层
 *  这里涉及到的最核心的协议,IP协议
 *  网络层IP协议,把刚才的传输层的UDP数据包作为一个整体,再拼加上IP协议报头,构造成一个IP数据包,构造成一个 IP数据包
 *
 *  IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello
 *  从头到尾构成 IP数据包
 *  IP报头为前一部分 后边就是 IP载荷了
 *
 *  IP协议,就相当于把整个 UDP数据包视为一个整体了
 *  IP报头,也会包含一些辅助转发的关键信息
 *  此处最关键的信息就是 源IP和目的IP 了
 *  构造完成完整的 IP数据包 之后,IP协议继续调用数据链路层的 api,把数据再交给数据链路层这里的协议去进行处理
 *
 *  4.数据链路层
 *  这里涉及到的核心协议,以太网
 *  以太,用来表示 网络数据传输的介质
 *  以太网,就是我们最常见到的有线网络
 *  我们日常用到的网线,也叫做"以太网线" 日常用到的网口也叫"以太网口"
 *  用到的交换机,也叫做"以太网交换机"
 *
 *  以太网数据帧.也是以IP数据包为整体,在这个基础上添加上帧头和帧尾
 *  以太网帧头|IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|以太网帧尾
 *  构成了以太网帧头帧尾,剩余部分就是以太网数据帧的载荷
 *
 *  5.物理层
 *  硬件设备
 *  把上述这样的以太网数据帧,二进制结构(一串 01 01 这样的数据),转换成光信号/电信号/电磁波
 *  然后进行发送
 *  经过上述一系列操作,数据终于发送出去了
 *  ------------------------------------------------
 *  暂时不考虑中间过程,假设数据包已经到达 B网卡了.B如何处理.
 *  B的处理过程,就称为"分用"
 *
 *  1. B的物理层收到了光信号/电信号/电磁波.就会把这些物理信号转换成数字信号(二进制 01 01 01)
 *  得到一个以太网数据帧,进一步那这个数据帧交给数据链路层
 *
 *  2.数据链路层 以太网 发送方和接收方得使用同样的协议
 *   以太网帧头|IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|以太网帧尾
 *   按照以太网数据帧的格式,来解析,取出其中的载荷,再交给上层协议(去掉头尾)
 *
 *  3.网络层 IP协议
 *
 *  IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello
 *  按照 IP协议 的格式进行解析,取出其中的协议,交给上层协议(去掉IP协议)
 *
 *  4.传输层 UDP协议
 *  按照UDP协议来解析,取出其中的载荷,再交给上层协议
 *  UDP报头|1233;3321;2024-3-13 12:00;hello
 *
 *  5.应用层 QQ应用程序
 *  按照 QQ应用程序内部的应用层协议格式来解析数据
 *  1233;3321;2024-3-13 12:00;hello
 *  QQ程序拿到这些信息之后,就会再窗口中给你弹出提示
 *  并且把消息/消息的发送者/发送时间 都显示到聊天窗口上
 *
 *  ------------------------------------------------------
 *  |  2024-3-13 12:00                                    |
 *  | |1233|:hello                                        |
 *  |                                                     |
 *  |-----------------------------------------------------|
 *  |                                            | 发送  | |
 *  ------------------------------------------------------|
 *
 *  分用的过程,就是封装的逆向过程
 *
 *  但实际上即使是经过交换机或者路由器,上述封装分用过程,也是同样适用的
 *  只不过,封装分用的程度不一定是到 应用层(五层都有)
 *
 *  经典交换机来说,就只需要封装分用到 数据链路层即可
 *  经典的路由器来说,就只需要封装分用到 网络层即可
 *
 *  假设这里有一个交换机
 *  以太网帧头|IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|以太网帧尾
 *  交换机的数据链路层就会对上述数据进行解析
 *  这个解析过程,一方面要取出载荷部分,另一方面,就要解析到帧头中的关键信息
 *  根据帧头中的信息,决定把下一步数据往哪里进行发送,再根据这个情况再进一步的构造出新的以太网数据帧
 *  新的帧头|IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|新的帧尾
 *  把这个新的数据继续通过物理层发送出去
 *
 *  如果是路由器,情况稍微复杂一点,就是封装分用到网络层
 *  先物理层拿到光电信号,转换成二进制交给数据链路层
 *  以太网帧头|IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|以太网帧尾
 *  数据链路层对上述数据进行进一步解析,拿到载荷,交给网络层 IP协议
 *  IP协议又会进一步对这个数据进行解析,取出载荷 当然也要解析这里的报头
 *  IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello
 *  路由器通过 IP报头中的 目的IP 来指导下一步具体如何进行转发
 *  取出的数据,IP协议重新进行封装
 *  新的IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello
 *  继续交给数据链路层,继续加上帧头帧尾
 *  帧头|新的IP报头|UDP报头|1233;3321;2024-3-13 12:00;hello|帧尾
 *  这个数据在交给物理层,转成光电信号,继续传输
 *  -------------------------------------------------------------------------
 *
 *  上述过程是经典的交换机和路由器,如果是现实的情况就可能更复杂
 *  比如交换机要截取/解析你传输的数据,就会封装分用到应用层,把你的hello拎出来看看
 *  具体怎么做,外人就无从得知了
 *
 *  因此,网络传输数据,并非是一个很简单的事情
 *  背后有大量的工作,只不过这些工作都是由 硬件 & 驱动 & 操作系统 帮我们完成了
 *
 *  描述一个网络数据上传输的数据 "单位" 可能会用到这几个术语
 *
 *  包(packet)    IP数据包
 *  段(segment)   TCP数据段
 *  报(datagram)  UDP数据报
 *  帧(frame)     以太网数据帧
 *
 *  
 */
public class Demo2 {

}
